package br.usp.fsi.bean;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import br.usp.fsi.conexoes.FabricaDeConexoes;
import br.usp.fsi.dao.LocalDao;
import br.usp.fsi.dao.MaterialDao;
import br.usp.fsi.dao.RegistroDao;
import br.usp.fsi.entity.Local;
import br.usp.fsi.entity.Material;
import br.usp.fsi.entity.Registro;

@ManagedBean
@SessionScoped
public class HistoricoBean {

	private List<Registro> historico;
	private Registro solicitacao;

	public String detalheSolicitacao() {
		if (getSolicitacaoSelecionada())
			return "DETALHE_SOLICITACAO";
		else
			return null;

	}

	private boolean getSolicitacaoSelecionada() {
		List<Registro> selecionados = new ArrayList<Registro>();

		for (int i = 0; i < historico.size(); i++) {
			Registro reg = historico.get(i);
			if (reg.isSelecionado()) {
				selecionados.add(reg);
			}
		}

		if (selecionados.size() == 0) {
			addMessageError("Selecione um item");
			return false;
		}

		if (selecionados.size() == 1) {
			solicitacao = selecionados.get(0);
			return true;
		} else {
			addMessageError("Selecione apenas um item");
		}
		return false;
	}

	private void carregaLocal(Registro registro) {
		try {
			LocalDao dao = new LocalDao();
			Local local = dao.getObject(FabricaDeConexoes.obterConexao(),
					registro.getIdLocal());
			registro.setLocal(local);
		} catch (Exception e) {
			addMessageError("Erro inesperado");
		}
	}

	@SuppressWarnings("unchecked")
	private void carregaMaterial(Registro registro) {
		List<Material> materiais = new ArrayList<Material>();

		try {
			MaterialDao dao = new MaterialDao();
			materiais = dao.loadAll(FabricaDeConexoes.obterConexao());
		} catch (Exception e) {
			addMessageError("Erro Inesperado");
		}
		if (!materiais.isEmpty()) {
			Iterator<Material> it = materiais.iterator();
			while (it.hasNext()) {
				Material mat = (Material) it.next();
				if (mat.getIdRegistro() != registro.getIdRegistro()) {
					it.remove();
				}
			}
		}

		if (!materiais.isEmpty())
			registro.setMaterial(materiais.get(0));
	}

	@SuppressWarnings("unchecked")
	public List<Registro> getHistorico() {
		try {
			RegistroDao dao = new RegistroDao();
			historico = dao.loadAll(FabricaDeConexoes.obterConexao());
		} catch (Exception e) {
			addMessageError("Erro Inesperado");
			return null;
		}

		Iterator<Registro> it = historico.iterator();

		while (it.hasNext()) {
			Registro reg = (Registro) it.next();
			if (reg.getStatus() != 3)
				it.remove();
			else {
				carregaLocal(reg);
				carregaMaterial(reg);
			}
		}
		return historico;
	}

	private void addMessageError(String string) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
				"Erro", string));
	}

	public void setHistorico(List<Registro> historico) {
		this.historico = historico;
	}

	public Registro getSolicitacao() {
		return solicitacao;
	}

	public void setSolicitacao(Registro solicitacao) {
		this.solicitacao = solicitacao;
	}

}
